package com.chenjun.mysite.common;

import java.io.Serializable;
import java.util.List;

/**
 * <h3>映射器实例（Mapper Instances）</h3>
 * <p>
 * 以下注释摘自mybatis官方文档:
 * </p>
 * 映射器是创建用来绑定映射语句的接口。映射器接口的实例是从 SqlSession 中获得的。因此从技术层面讲，映射器实例的最大作用域是和
 * SqlSession 相同的， 因为它们都是从 SqlSession
 * 里被请求的。尽管如此，映射器实例的最佳作用域是方法作用域。也就是说，映射器实例应该在调用它们的方法中被请求，
 * 用过之后即可废弃。并不需要显式地关闭映射器实例，尽管在整个请求作用域（request scope）保持映射器实例也不会有什么问题，但是很快你会发现， 像
 * SqlSession 一样，在这个作用域上管理太多的资源的话会难于控制。所以要保持简单，最好把映射器放在方法作用域（method scope）内。
 * 下面的示例就展示了这个实践：
 * <p>
 * SqlSession session = sqlSessionFactory.openSession(); try { BlogMapper mapper
 * = session.getMapper(BlogMapper.class); // do work } finally {
 * session.close(); }
 * </p>
 * 
 * @author Administrator
 *
 *
 * @param <T>
 * @param <PK>
 */
public interface IBaseMapper<T extends IdEntity, PK,M>
{
	/**
	 * 插入一条记录
	 * 
	 * @param entity
	 * @return
	 */
	int insert(T entity);

	/**
	 * 插入（批量）
	 * 
	 * @param entityList
	 * @return
	 */
	int insertBatch(List<T> entityList);

	/**
	 * 根据 ID 删除
	 * 
	 * @param id
	 * @return
	 */
	int deleteById(PK id);

	/**
	 * <p>
	 * 删除（根据ID 批量删除）
	 * </p>
	 * 
	 * @param idList
	 *            主键ID列表
	 * @return int
	 */
	int deleteBatchIds(List<? extends PK> idList);


	/**
	 * 根据 entity ，更新记录
	 * 
	 * @param entity
	 * @return
	 */
	int update(T entity);

	/**
	 * 根据 ID 查询
	 * 
	 * @param id
	 * @return
	 */
	T selectById(PK id);

	/**
	 * 查询（根据ID 批量查询）
	 * 
	 * @param idList
	 * @return
	 */
	List<T> selectBatchIds(List<? extends PK> idList);

	/**
	 * 根据 entity 条件，查询一条记录
	 * 
	 * @param entity
	 * @return
	 */
	T selectOne(T entity);
	
	/**
	 * 查询符合条件的所有集合
	 * @param entity
	 * @return
	 */
	List<T> selectList(T entity);
	
	/**
	 * 查询该表所有数据，慎用
	 * @return
	 */
	List<T> selectAll(Long limitRow);

	/**
	 * 根据entity里面的条件进行分页查询
	 * @param entity
	 * @param page
	 * @return
	 */
	List<T> selectPageList(T entity,Page<T> page);
	
	/**
	 * <p>
	 * 根据 entity 条件，查询总记录数
	 * </p>
	 */
	int selectCount(T entity);

}
